module Shifter(
	input  [31:0] value_in ,
	input  [1:0]  shiftop ,
	input  [4:0]  shiftamt ,
	output [31:0] result
	) ;

	// Shift operations
    // Shift right logic
	assign result = (shiftop == 2'b00) ? (value_in >> shiftamt) : 32'bz;

    // Shift right arithmetic
    generate
    genvar i;
    for (i = 31; i >= 0; i = i - 1) begin: sra
        assign result[i] = ((shiftop == 2'b01) && (i >= (31 - shiftamt))) ? value_in[31] : 32'bz;
    	assign result[i] = ((shiftop == 2'b01) && (i < (31 - shiftamt))) ? value_in[i+shiftamt] : 1'bz;
    end
    endgenerate

    // Shift left logic
	assign result = (shiftop == 2'b10) ? (value_in << shiftamt) : 32'bz;

endmodule
